package ar.fi.uba.celdas.interfaces.bc;

import java.util.Collection;
import java.util.List;

import ar.fi.uba.celdas.interfaces.ambiente.IAccion;
import ar.fi.uba.celdas.interfaces.ambiente.IInfoRobot;
import ar.fi.uba.celdas.interfaces.planificacion.IPlanificacion;
import ar.fi.uba.celdas.interfaces.ponderador.IPonderador;

public interface IBaseConocimientos {
	/**
	 * @return lista de todas las reglas en la Base de Conocimientos
	 */
	List<Regla> getReglas();
	
	/**
	 * @return Colección de estados deseados de sensores. Por ejemplo, si el
	 * sensores devueltos son "POSX" = 55 y "POSY" = 70, significa que el objetivo
	 * es lograr que el sensor "POSX" sea igual a 55 y "POSY" sea igual a 70.  
	 */
	Collection<Sensor> getObjetivo();
	
	/**
	 * @return colección de estados de los sensores del robot antes de aplicar
	 *  la última Regla.
	 */
	Collection<Sensor> getEstadoAnterior();
	
	/**
	 * @return colección de estados de los sensores del robot actualmente
	 */
	Collection<Sensor> getEstadoActual();
	
	/**
	 * @return colección de acciones posibles que el robot puede realizar
	 */
	Collection<IAccion> getAccionesDisponibles();
	
	/**
	 * @param infoRobot
	 * @return el robot llama a este método para que procese cuales son 
	 * las siguientes acciones que debe ejecutar.
	 */
	List<IAccion> procesarSiguientesAcciones(IInfoRobot infoRobot);
	
	/**
	 * @return máximo  valor posible del sensor
	 */
	int getMaxValor(Sensor sensor);
	
	/**
	 * @return mínimo valor posible del sensor
	 */
	int getMinValor(Sensor sensor);

	/**
	 * @return lista de estados conocidos de la base de conocimientos.
	 */
	Collection<Sensor> getEstadosConocidos();
	
	public void setPlanificador(IPlanificacion planificador);

	public void setPonderador(IPonderador ponderador);

}
